<?php defined('SYSPATH') or die('No direct script access.');

class Model_Good extends ORM
{ 
    protected $_table_name = 'goods'; 
    const GOODS_PER_PAGE = 15; 
    
    public function get_goods($supplier_id = null, $page = null, $get_count = false, $order_by = 'id')
    {        
        
        $query = $this->select();
        
        if($supplier_id){
            $query->where('supplier_id','=',$supplier_id);
        }
            
        if ($page) {
            $count = $this->get_goods_per_page();
            $offset = ($page - 1) * $count;
            $query->offset($offset)->limit($count);    
        }
        
        if ($order_by) {
            $query->order_by($order_by, 'DESC');   
        }
        
        if ($get_count) {
            $count = $query->count_all();                                                                                       
            return $count;   
        }
        $goods = $query->find_all()->as_array();                                                                                                             
        return $goods;       
    }
    
    public function get_goods_per_page()
    {
        return self::GOODS_PER_PAGE;
    }
    
    public function search($query, $page = 1, $is_test = false)
    {
        $query = self::get_clean_search_query($query);
        /*$query = str_replace(
            array(' в ', 'для полных', 'для детей', 'для женщин', 'шапок', 'норковую', 'штаны'),
            array(' ', 'больших размеров', 'детские', 'женские', 'шапки', 'норка', 'брюки'),
            $query
        );  */
        
        $stop_words = array(
            'оптом', /*'дешев', 'дорог', 'доставк', 'заказ', 'магазин', 'интернет', 'купить', 'куплю', 'москв', 'продаж', 'цен', 'скидк', 'где', 'можно',
            'спб', 'розниц', 'наложенны', 'платеж', 'через', 'хочу', 'форум', 'оригинал', 'бренд', 'онлайн', 'какие', 'каталог', /*'2012', '2013', '2014', */
            /*'лучш', 'фото', 'новый', 'фирм', 'элитн', 'настоящ', 'официальн', 'сайт', 'классный', 'импортный', */
            
            /*'красноярск', 'екатеринбург', 'челябинск', 'ярославл', 'стамбул', 'тюмен', 'питер', 'омск', 'киров', 'тул', 'саратов', 'харьков',
            'нижн', 'новгород', 'новосибирск', 'перм', 'воронеж', 'ростов', /*'уф',*/ /*'краснодар', 'санкт', 'петербург', 'самар', 'казан', 'иркутск',
            'хабаровск', 'киров', 'ижевск', 'барнаул', 'кемеров', 'луганск', 'твер', 'липецк', 'волгоград', 'пенз', 'костром', 'ульяновск',
            'владимир', 'николаев', 'витебск', 'курск', 'тольятти', 'кривой рог', 'кривом рогу', 'сургут', 'чит', 'белгород', 'иваново', 'брянск',
            'курган', 'смоленск', 'тамбов', 'могилев', 'калининград', 'хмельницк', 'владивосток', 'саранск', */
        );
        
        $repalces = array(
            // Страны
            /*'итальянск' => 'италия',
            'российск'  => 'россия',
            'китайск'   => 'китай',
            'канадск'   => 'канада',
            'немецк'    => 'германия',
            'японск'    => 'япония',
            'шведск'    => 'швеция',
            'польск'    => 'польша',
            'финск'     => 'финляндия',
            'турецк'    => 'турция',
            'индийск'    => 'индия',
            
            // Состав
            'хлопков'         => 'хлопок',
            'полиэстеров'     => 'полиэстер',
            'кожан'         => 'кожа',
            'нейлонов'         => 'нейлон',
            'пластиков'     => 'пластик',
            'шерстян'         => 'шерсть',
            'текстильн'     => 'текстиль',
            'акрилов'         => 'акрил',
            'металлич'         => 'металл',
            'лайкров'         => 'лайкра',
            'льнян'         => 'лен',
            'полиуретанов'     => 'полиуретан',
            'шелков'         => 'шелк',
            'велюров'         => 'велюр',
            'замшев'         => 'замша',
            'полиакрилов'     => 'полиакрил',
            'фарфоров'         => 'фарфор',
            'нубуков'         => 'нубук',
            'стеклян'         => 'стекло',
            'ангоров'         => 'ангора',
            'кашемиров'     => 'кашемир',
            'резинов'         => 'резина',
            'стальн'         => 'сталь',
            'бумажн'         => 'бумага',
            'нубуков'         => 'нубук',
            'деревян'         => 'дерево',
            
            // Сезон
            'летн'             => 'лето',
            'демисезонн'     => 'демисезон',
            'зимн'             => 'зима', */
        );
        
        $prepositions = array(
            'из', 'с', 'на',
        );
        
        $words       = explode(' ', $query);
        $clean_query = array();
        foreach ($words as $word) {
            $word  = trim($word);
            $found = false;
            foreach ($stop_words as $stop_word) {
                if (strstr($word, $stop_word) !== false) {
                    $found = true;
                    break;
                }    
            } 
            foreach ($prepositions as $preposition) {
                if ($word == $preposition) {
                    $found = true;
                    break;
                } 
            }
            if (!$found) {
                $found = false;
                foreach ($repalces as $first => $second) {
                    if (strstr($word, $first) !== false) {
                        $clean_query[] = $second;
                        $found = true;
                        break;
                    }    
                }
                if (!$found) {
                    $clean_query[] = $word;   
                }
            }
        }
        $clean_query = implode(' ', $clean_query);
        
        $limit  = self::get_goods_per_page();
        $offset = 0;
        if ($page) {
            //$limit = self::get_products_per_page();
            $offset = ($page - 1) * $limit;   
        }
        
        // создаем инстанц клиента
        $cl = new Library_SphinxClient();
         
        // настройки
        $cl->SetServer("109.120.184.15", 9312);
        $cl->SetConnectTimeout(5);
        if ($is_test) {
            $cl->SetLimits(0, 100000, 100000);
            //$cl->SetLimits(0, 30, 30);    
        } else {
            $cl->SetLimits($offset, $limit, 1000);   
        }
        $cl->SetMatchMode(SPH_MATCH_EXTENDED);
        $cl->SetArrayResult(true);
        $cl->SetFieldWeights(array (
            'good_name'             => 100,
            'good_price'            => 10,
            'good_description'      => 100,
            //'good_kei'
            'supplier_name'         => 70,
            'supplier_type'         => 70,
            'supplier_volume'       => 70,
            'supplier_payment_options' => 70,
            'supplier_delivery_methods' => 70,
            'supplier_legal_person' => 70,
            'supplier_description'  => 100,
            'supplier_buy_opt'      => 70,
            'supplier_address'      => 90,
        )); 
        //$cl->SetSortMode(SPH_SORT_EXPR, 'product_sort DESC, product_price ASC');
        //$cl->SetSortMode(SPH_SORT_ATTR_DESC, 'product_sort');
        
        //$cl->SetRankingMode(SPH_RANK_PROXIMITY_BM25);
        //$cl->SetMatchMode(SPH_MATCH_ANY);
        
        /*if ($category) {
            $category_id = $category;
            if ($category instanceof Model_Category) {
                $category_id = $category->id;    
            }
            $category_filter = array($category_id);
            if (is_array($category)) {
                $category_filter = $category;
            }
            $cl->SetFilter('product_category_id', $category_filter);
        }   */
        
        $result = $cl->Query($clean_query);
        
        $products = array();
        $count    = 0;
        if ($result) {
            if ($is_test) {
                $_result = array(
                    'result' => array(),
                    'count'    => 0,
                );
                if ($result['total']) {
                    foreach ($result['matches'] as $match) {
                        $_result['result'][] = array(
                            'id' => $match['id'],
                            'weight' => $match['weight'],
                        );
                    } 
                    $_result['count'] = $result['total']; 
                }
                return $_result;    
            }
            if (isset($result['matches'])) {
                if (count($result['matches']) < $this->get_goods_per_page()) {
                    $words = explode(' ', $clean_query); 
                    foreach ($words as $word) {
                        $query = str_replace($word, '', $clean_query);
                        $query = str_replace('  ', ' ', $query); 
                        
                        $data = $cl->Query($query);
                        if (isset($data['matches'])) {
                            $result['matches'] = array_merge($result['matches'], $data['matches']);    
                        }                                                                        
                    }   
                }  
                
                $ids = array();
                $n = 1;  
                foreach ($result['matches'] as $match) {
                    if (!isset($ids[$match['id']])) {
                        $ids[$match['id']] = $n;
                        $n++;
                    }
                }
                $_products = ORM::factory('good')
                                ->where('id', 'IN', array_keys($ids))
                                //->where('is_available', '=', 1)
                                //->order_by('price', 'ASC')
                                ->find_all()
                                ->as_array();
                foreach ($_products as $product) {
                    $products[$ids[$product->id]] = $product;
                }
                
                ksort($products);
                
                /*echo '<pre>';
                print_r($products);
                die();  */      
                
                /*$ids = array(
                    'total'        => array(),
                    'goods'     => array(),
                    'suppliers' => array(),
                );
                $n = $ngoods = $nsuppliers = 1;
                foreach ($result['matches'] as $match) {
                    if ($match['id'] > 1000000) {    // товар, -1000000
                        $id = $match['id'] - 1000000;
                        if (!isset($ids['goods'][$id])) {
                            $ids['goods'][$id] = $ngoods;
                            $ngoods++; 
                        }
                        if (!isset($ids['total'][$match['id']])) {
                            $ids['total'][$match['id']] = $n;
                            $n++; 
                        }
                    } else {
                        if (!isset($ids['suppliers'][$match['id']])) {
                            $ids['suppliers'][$match['id']] = $nsuppliers;
                            $nsuppliers++; 
                        }
                        if (!isset($ids['total'][$match['id']])) {
                            $ids['total'][$match['id']] = $n;
                            $n++; 
                        }
                    }  
                } 
                $_products = array();
                $_ids       = array_keys($ids['goods']);
                if (count($_ids)) {
                    $_products = ORM::factory('good')
                                    ->where('id', 'IN', $_ids)
                                    //->where('is_available', '=', 1)
                                    //->order_by('price', 'ASC')
                                    ->find_all()
                                    ->as_array();
                    foreach ($_products as $product) {
                        $products[$ids['total'][$product->id+1000000]] = $product;     
                    }
                }
                
                $_suppliers = array();
                $_ids       = array_keys($ids['suppliers']);
                if (count($_ids)) {
                    $_suppliers = ORM::factory('supplier')
                                    ->where('id', 'IN', $_ids)
                                    ->find_all()
                                    ->as_array();
                    foreach ($_suppliers as $supplier) {
                        $products[$ids['total'][$supplier->id]] = $supplier;     
                    }
                }     */
                
                
                
            }
            if (isset($result['total'])) {
                $count = $result['total'];
            }   
        }
        
        return array(
            'result'    => $products,
            'count'     => $count,
        );
    }
    
    public function add_goods($supplier_id, $name, $price, $description, $img, $url)
    {
        $this->supplier_id     = $supplier_id;
        $this->name            = $name;
        $this->price           = $price;
        $this->description     = $description;
        $this->img             = $img;
        $this->url             = $url;
        
        try {
            $this->save();
        } catch (Database_Exception $e) {
            if (strstr($e->getMessage(), 'Duplicate entry') !== false) {
                return null;
            }
        }
        
        return $this;  
    }
    
    function get_clean_search_query($query)
    {
           return trim(str_replace(array('+', 'ё', '"'), array('', 'е', ''), $query));
    }    
}